# 创建时间：2024/7/10下午1:10


class Convert:
    @staticmethod
    def to_str(value: int | bytes, scale=10, bit=0):
        """
        把bytes或int转换为指定数制的字符串，可设定最少位数

        :param value: 要转换的值，可以是bytes或int
        :param scale: 要转换的数制，可以是2、10、16
        :param bit: 转换后的最少位数，不足的用0补齐，只对int有效
        :return: 返回转换后的字符串
        """
        if scale == 2 or scale == 'b':
            scale = 2
        elif scale == 10 or scale == 'd':
            scale = 10
        elif scale == 16 or scale == 'x' or scale == 'f':
            scale = 16
        else:
            raise ValueError('参数错误，数制参数scale应为2、10或16')
        if isinstance(value, bytes):
            match scale:
                case 2:
                    return ''.join(['{:08b}'.format(i) for i in value])
                case 10:
                    return ','.join([str(i) for i in value])
                case 16:
                    return value.hex()
        elif isinstance(value, int):
            match scale:
                case 2:
                    return format(value, f'0{bit}b')
                case 10:
                    return str(value)
                case 16:
                    # noinspection PyStringFormat
                    return f'%0{bit}x' % value
        else:
            raise TypeError('未定义的转换类型，仅允许转换int和bytes')

    @staticmethod
    def to_byte(value: str | int, scale=0):
        """
        把str或int转换为bytes，int或数字型str转bytes时使用大端字节序

        :param value: 要转换的值，可以是str或int
        :param scale: str的解读方式，为0时按字符解读，为2、10、16时按对应进制的数字解读
        :return: 返回转换后的字节串
        """
        if scale == 2 or scale == 'b':
            scale = 2
        elif scale == 10 or scale == 'd':
            scale = 10
        elif scale == 16 or scale == 'x' or scale == 'f':
            scale = 16
        else:
            scale = 0
        if isinstance(value, str):
            match scale:
                case 2:
                    return int(value, 2).to_bytes((len(value) + 7) // 8, byteorder='big')
                case 10:
                    return int(value).to_bytes((len(value) + 7) // 8, byteorder='big')
                case 16:
                    return bytes.fromhex(value)
                case _:
                    return value.encode('utf-8')
        elif isinstance(value, int):
            return value.to_bytes((int.bit_length(value) + 7) // 8, 'big')
        else:
            raise TypeError('未定义的转换类型，仅允许转换int和str')

    @staticmethod
    def to_int(value, scale=10, signed: bool = False):
        """
        把str或int转换为bytes，int或数字型str转bytes时使用大端字节序

        :param value: 要转换的值，可以是str或bytes
        :param scale: str的解读方式，为2、10、16时按对应进制的数字解读
        :param signed: 字节串转数字时是否有符号，默认为False
        :return: 返回转换后的整数
        """
        if scale == 2 or scale == 'b':
            scale = 2
        elif scale == 10 or scale == 'd':
            scale = 10
        elif scale == 16 or scale == 'x' or scale == 'f':
            scale = 16
        else:
            raise ValueError('参数错误，数制参数scale应为2、10或16')
        if isinstance(value, bytes):
            return int.from_bytes(value, 'big', signed=signed)
        if isinstance(value, str):
            match scale:
                case 2:
                    return int(value, 2)
                case 10:
                    return int(value)
                case 16:
                    return int(value, 16)
